#include "CXMLSaxList.h"

namespace lampe{
namespace xml{

int CXMLSaxList::getNodeType(){
	return elements[index].type;
}

String CXMLSaxList::getNodeName(){
	return elements[index].name;
}

bool CXMLSaxList::isEmptyElement(){
	return elements[index].isEmpty;
}

u32 CXMLSaxList::getAttributeCount(){
	return elements[index].attribytes.size();
}

String CXMLSaxList::getAttributeName(u32 i){
	return elements[index].attribytes[i].name;
}

String CXMLSaxList::getAttributeValue(u32 i){
	return elements[index].attribytes[i].value;
}

String CXMLSaxList::getNodeData(){
	return elements[index].text;
}

bool CXMLSaxList::isCDATA(){
	return elements[index].cdata;
}

void CXMLSaxList::parse(CXMLSaxParser*reader){
	CXMLSaxList*self=(CXMLSaxList*)reader->getTag();
	self->readedElement(reader);
}

void CXMLSaxList::readedElement(CXMLSaxParser*parser){
	element e;
	e.type=parser->getNodeType();
	for (u32 i=0;i<parser->getAttributeCount();i++){
		att a(parser->getAttributeName(i),parser->getAttributeValue(i));
		e.attribytes.push_back(a);
	}
	e.name=parser->getNodeName();
	e.isEmpty=parser->isEmptyElement();
	e.text=parser->getNodeData();
	e.cdata=parser->isCDATA();
	elements.push_back(e);
}

bool CXMLSaxList::read(){
	if (index==elements.size()-1)
		return false;
	index++;
	return true;
}

CXMLSaxList::CXMLSaxList(stream::IReader*reader){
	index=0;
	CXMLSaxParser*parser=new CXMLSaxParser();
	parser->setTag(this);
	parser->read(reader,parse);
	parser->drop();
}

IXMLSaxList*createSAXList(stream::IReader*parser){
	return new CXMLSaxList(parser);
}

}//namespace xml
}//namespace lampe
